package com.zpself.module.JDK8新功能.Stream;

import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import java.util.stream.IntStream;
import java.util.stream.Stream;

/**
 * @author By ZengPeng   参考：https://zhuanlan.zhihu.com/p/220706448
 * @Description  stream操作数据的三大步骤为：数据源，中间操作，终止操作。
 *      Stream 有如下特点，
 *          Stream 自己不保存数据。
 *          Stream 不会改变源对象，每次中间操作后都会产生一个新的 Stream。
 *          Stream 的操作是延迟的，中间操作只保存操作，不做计算。只有终止操作时才会计算结果。
 * @date in  2021/3/2 9:50
 * @Modified By
 */
public class a数据源 {

    @Test
    //    数据的来源包括：
    //          集合的流
    //          数组的流
    //          Stream接口的 of() ，generate()，iterate()方法
    //          IntStream，LongStream，DoubleStream 的 of、range、rangeClosed 方法
    public  void main(){
//一、集合的流
        List<String> list = new ArrayList<>();
        //顺序流
        Stream<String> stream = list.stream();
        //并行流
        Stream<String> parallelStream = list.parallelStream();
        //遍历元素
        stream.forEach(System.out::println);

//二、数组的流
        String[] arr = {"abc","aa","ef"};
        Stream<String> stream1 = Arrays.stream(arr);

//三、Stream接口的 of() ，generate()，iterate()方法
        //注意，of() 方法返回的是有限流，即元素个数是有限的，就是你传入的元素个数。
        //而 generate()，iterate() 这两个方法，是无限流，即元素个数是无限个。
        //of  of()方法底层用的也是 Arrays.stream()方法。
        Stream<Integer> stream2 = Stream.of(10, 20, 30, 40, 50);
        stream.forEach(System.out::println);
        //generate，每个元素都是0~99的随机数
        Stream<Integer> generate = Stream.generate(() -> new Random().nextInt(100));
        //iterate，从0开始迭代，每个元素依次增加2
        Stream<Integer> iterate = Stream.iterate(0, x -> x + 2);


//四、IntStream，LongStream，DoubleStream 的 of、range、rangeClosed 方法
        //底层用的也是 Arrays.stream()方法。
        IntStream intStream = IntStream.of(10, 20, 30);
        //得到：从0每次递增1，到10，包括0，但不包括10
        IntStream rangeStream = IntStream.range(0, 10);
        //从0每次递增1，到10，包括0和10
        IntStream rangeClosed = IntStream.rangeClosed(0, 10);
    }


}
